package lg.minecraft.plugin.entityclear.manager;

import lg.minecraft.plugin.entityclear.task.EntityClearTask;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * 实体清理任务管理器
 * 用于管理多个实体清理任务，提供任务的增删查改等操作
 *
 * @author langle__
 * @version 1.0
 */
public class EntityTaskManager {

    public static final EntityTaskManager INSTANCE = new EntityTaskManager();

    private final Map<String, EntityClearTask> taskMap = new HashMap<>();

    private EntityTaskManager() {
    }

    /**
     * 添加任务到管理器中
     *
     * @param name 任务名称，不能为空
     * @param task 实体清理任务对象，不能为空
     */
    public void addTask(@NotNull String name, @NotNull EntityClearTask task) {
        this.taskMap.put(name, task);
    }

    /**
     * 根据名称获取任务
     *
     * @param name 任务名称，不能为空
     * @return 对应的EntityClearTask对象，如果不存在则返回null
     */
    @Nullable
    public EntityClearTask getTask(@NotNull String name) {
        return this.taskMap.get(name);
    }

    /**
     * 根据名称移除任务
     *
     * @param name 要移除的任务名称，不能为空
     */
    public void removeTask(@NotNull String name) {
        this.taskMap.remove(name);
    }

    /**
     * 清空所有任务
     */
    public void clear() {
        this.taskMap.clear();
    }

    /**
     * 获取所有任务的键集合
     *
     * @return 包含所有任务键的Set集合，不会为null
     */
    @NotNull
    public Set<String> getKeySet() {
        return this.taskMap.keySet();
    }

    /**
     * 获取所有任务值的集合
     *
     * @return 包含所有任务值的Collection集合，不会为null
     */
    @NotNull
    public Collection<EntityClearTask> getValues() {
        return this.taskMap.values();
    }

    /**
     * 获取所有任务条目
     *
     * @return 包含所有任务条目的Set集合，不会为null
     */
    @NotNull
    public Set<Map.Entry<String, EntityClearTask>> getEntrySet() {
        return this.taskMap.entrySet();
    }

    /**
     * 检查是否存在指定名称的任务
     *
     * @param name 任务名称，不能为空
     * @return 如果存在返回true，否则返回false
     */
    public boolean containsTask(@NotNull String name) {
        return this.taskMap.containsKey(name);
    }

    /**
     * 获取任务数量
     *
     * @return 当前任务数量
     */
    public int size() {
        return this.taskMap.size();
    }

    /**
     * 检查任务集合是否为空
     *
     * @return 如果为空返回true，否则返回false
     */
    public boolean isEmpty() {
        return this.taskMap.isEmpty();
    }

    /**
     * 批量添加任务
     *
     * @param tasks 包含任务的Map集合，不能为空
     */
    public void addAllTasks(@NotNull Map<@NotNull String, @NotNull EntityClearTask> tasks) {
        this.taskMap.putAll(tasks);
    }

    /**
     * 检查是否包含指定的任务对象
     *
     * @param task 要检查的任务对象，不能为空
     * @return 如果包含返回true，否则返回false
     */
    public boolean containsTaskValue(@NotNull EntityClearTask task) {
        return this.taskMap.containsValue(task);
    }

}
